package main

import (
	"fmt"
	"sort"
)

func main() {
	//搜索使用二分搜索来查找并返回 [0, n) 中 f(i) 为真的最小索引 i，假设在范围 [0, n) 上，f(i) == true 意味着 f(i+ 1) == 真。
	//也就是说，搜索要求 f 对于输入范围 [0, n) 的某些（可能为空）前缀为假，然后对于（可能为空）余数为真；搜索返回第一个真正的索引。
	//如果没有这样的索引，则搜索返回 n。 （请注意，“未找到”返回值不是 -1，例如，strings.Index。）搜索仅对 [0, n 范围内的 i 调用 f(i)。
	//
	//Search 的一个常见用途是在排序的、可索引的数据结构（例如数组或切片）中查找值 x 的索引 i。
	//在这种情况下，参数 f，通常是一个闭包，捕获要搜索的值，以及数据结构的索引和排序方式。
	//
	//例如，给定一个按升序排序的切片数据，
	//调用 Search(len(data), func(i int) bool { return data[i] >= 23 }) 返回最小索引 i 使得 data[i] > = 23。
	//如果调用者要查找23是否在切片中，则必须单独测试data[i] == 23。
	//
	//搜索按降序排序的数据将使用 <= 运算符而不是 >= 运算符。

	a := []int{1, 3, 6, 10, 15, 21, 28, 36, 45, 55}
	x := 61

	i := sort.Search(len(a), func(i int) bool {
		return a[i] >= x
	})

	if i < len(a) && a[i] == x {
		//found 6 at index 2 in [1 3 6 10 15 21 28 36 45 55]
		fmt.Printf("found %d at index %d in %v\n", x, i, a)
	} else {
		fmt.Printf("%d not found in %v\n", x, a)
	}
}
